//#######################################################################
FILE *fopen(const char *path, const char *mode);    //打开文件，失败返回NULL
//参数说明：
//参数path字符串包含欲打开的文件路径及文件名，参数mode字符串则代表着流形态。
//mode有下列几种形态字符串:
//r    以只读方式打开文件，该文件必须存在。
//r+   以可读写方式打开文件，该文件必须存在。
//rb+  读写打开一个二进制文件，允许读写数据，文件必须存在。
//rw+  读写打开一个文本文件，允许读和写。
//w    打开只写文件，若文件存在则文件长度清为0，即该文件内容会消失。若文件不存在则建立该文件。
//w+   打开可读写文件，若文件存在则文件长度清为零，即该文件内容会消失。若文件不存在则建立该文件。
//a    以附加的方式打开只写文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾，即文件原先的内容会被保留。（EOF符保留）
//a+   以附加方式打开可读写的文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾后，即文件原先的内容会被保留。 （原来的EOF符不保留）
//wb   只写打开或新建一个二进制文件；只允许写数据。
//wb+  读写打开或建立一个二进制文件，允许读和写。
//ab+  读写打开一个二进制文件，允许读或在文件末追加数据。
//at+  打开一个叫string的文件，a表示append,就是说写入处理的时候是接着原来文件已有内容写入，不是从头写入覆盖掉，t表示打开文件的类型是文本文件，+号表示对文件既可以读也可以写。
//上述的形态字符串都可以再加一个b字符，如rb、w+b或ab+等组合，加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b，表示默认加了t，即rt,wt,其中t表示以文本模式打开文件。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限，此文件权限也会参考umask值。
//有些C编译系统可能不完全提供所有这些功能，有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等，读者注意所用系统的规定。
int fclose(FILE *stream);    //关闭一个文件流，成功返回0, 失败返回EOF
int feof(FILE *stream);    //文件结束返回非0
int fseek(FILE *stream, long offset, int fromwhere);    //文件位置指针偏移，成功返回0
                                     //0文件头，1当前，2文件尾
long ftell(FILE *stream);    //返回文件位置指针当前位置
int fgetc(FILE *stream);    //结尾或出错返回EOF
int fputc(int n, FILE *fp);    //失败返回EOF
char *fgets(char *buf, int bufsize, FILE *stream);    //出错返回NULL
int fputs(const char *str, FILE *fp);    //向文件写入字符串，失败返回EOF
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);    //读取文件中count*size个字节，成功返回读取到的元素个数(count)，否则返回0
size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream);    //返回实际写入的数据块数目
int fscanf(FILE *stream, const char *format, [argument...]);
int fprintf(FILE *stream, const char *format, [argument...]);
//#######################################################################
#define STDIN_FILENO 0    //标准输入
#define STDOUT_FILENO 1    //标准输出
#define STDERR_FILENO 2    //标准错误
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>     //open、close头文件
int open(const char *pathname,int flags);    //文件存在
int open(const char *pathname,int flags,mode_t mode);    //文件不存在
//成功返回fd，失败返回-1
int close (int fd);    //关闭文件，成功返回0,失败返回-1
#include <unistd.h>    //write,read,remove头文件
ssize_t write(int fd,const void *addr,size_t count);    //写文件，成功返回写入字节个数，失败返回-1
ssize_t read(int fd,void *addr,size_t count);    //读文件，成功返回读出字节个数，失败返回-1
int remove(const char *pathname);    //删除文件,成功返回0,失败返回-1
#include <sys/types.h>
#include <unistd.h>    //进程函数头文件
pid_t getpid();    //获取本进程号
pid_t getppid();    //获取父进程号
pid_t getpgid();    //获取进程组号
pid_t fork();    //在已有进程中创建子进程
//成功，子进程返回0,父进程返回子进程ID；失败，返回-1
unsigned int sleep(unsigned int sec);    //进程挂起指定秒数
//成功返回0,中断返回剩余秒数
#include <sys/wait.h>    //wait、waitpid头文件
pid_t wait(int *status);    //等待子进程结束回收其资源
//成功返回子进程号，失败返回-1
WIFEXITED(status);    //子进程正常终止取出字段值非零
WEXITSTATUS(status)    //返回保存在status变量8~16位的子进程退出状态（正常退出才可使用）
pid_t waitpid(pid_t pid,int *status,int options);    //等待子进程结束回收其资源
//成功返回子进程号，失败返回-1
#include <stdlib.h>    //exit头文件
void exit(int value);    //结束进程执行
#include <unistd.h>    //_exit头文件，value低八位有效
void _exit(int value);    //结束进程执行，value低八位有效
#include <stdlib.h>    //atexit头文件
int atexit(void (*function)(void));    //注册进程结束前调用的函数
pid_t vfork();    //创建子进程，出错返回-1
#include <unistd.h>    //exec函数组头文件
int execl(const char *pathname,const char *arg0,...,NULL);
int execlp(const char *filename,const char *arg0,...,NULL);
int execle(const char *pathname,const char *arg0,...,NULL,char *const envp[]);
int execv(const char *pathname,char *const argv[]);
int execvp(const char *filename,char *const argv[]);
int execve(const char *pathname,char *const argv[],char *const envp[]);
//exec函数组成功无返回，失败返回-1
#include <stdlib.h>    //system头文件
int system(const char *command);    //调用系统命令，command空时返回非0,失败返回127或-1
//Ctrl+c产生中断信号:SIGINT
//Ctrl+\产生中断信号:SIGQUIT
//Ctrl+z产生中断信号:SIGSTOP
//SIGKILL和SIGSTOP的处理方式不可更改
#include <sys/types.h>
#include <signal.h>    //kill头文件
int kill(pid_t pid,int signum);    //给进程发送信号，成功返回0,失败返回-1
#include <unistd.h>    //alarm头文件
unsigned int alarm(unsigned int seconds);    //seconds秒后发出SIGALRM信号，默认终止
#include <signal.h>    //raise头文件
int raise(int signum);    //给进程发送信号，成功返回0,失败返回-1
#include <stdlib.h>    //abort头文件
void abort();    //默认向进程发送SIGABRT信号，默认退出
//终止前刷新缓冲区，关闭文件描述符
#include <unistd.h>    //pause头文件
int pause();    //挂起进程直至捕捉到信号，成功返回-1
#include <signal.h>    //signal头文件
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler);    //注册信号处理函数
                               SIG_IGN    //忽略信号
							   SIG_DFL    //执行默认动作
							   自定义
#include <signal.h>    //信号集头文件
int sigemptyset(sigset_t *set);    //初始化一个空信号集，成功返回0,失败返回-1
int sigfillset(sigset_t *set);    //初始化为所有信号的集合，成功返回0,失败返回-1
int sigismember(const sigset_t *set,int signum);    //查询signum是否在set中，在返回1,不在返回0,错误返回-1
int sigaddset(sigset_t *set,int signum);    //加signum到set中，成功返回0,失败返回-1
int sigdelset(sigset_t *set,int signum);    //从set中删除signum，成功返回0,失败返回-1
int sigprocmask(int how,const sigset_t *set,sigset_t *oldset);    //编辑阻塞集，成功返回0,失败返回-1
                SIG_BLOCK    //添加set集合
				SIG_UNBLOCK    //删除set集合
				SIG_SETMASK    //设置为set集合
#include <unistd.h>    //管道头文件
int pipe(int fd[2]);    //创建pipe，成功返回0,失败返回-1
void fcntl(fd,F_SETFL,0);    //设置文件阻塞
                      O_NONBLOCK    //设置文件非阻塞
int dup(int oldfd);    //成功返回新文件描述符，失败返回-1
int dup2(int oldfd,int newfd);    //强制分配并返回newfd，失败返回-1
//close_on_exec 标志决定文件描述符在执行exec之后是否可用
int flags;
flags=fcntl(fd,F_GETFD);    //获得标志
flags|=FD_CLOEXEC;    //打开标志位
flags&=~FD_CLOEXEC;    //关闭标志位
fcntl(fd,F_SETFD,flags);    //设置标志
#include <sys/types.h>
#include <sys/stat.h>    //mkfifo头文件
int mkfifo(const char *pathname,mode_t mode);    //创建fifo，成功返回0,文件已存在返回-1
//不指定NONBLOCK
//open只读打开FIFO，阻塞至某进程为写打开FIFO
//open只写打开FIFO，阻塞至某进程为读打开FIFO
//open以只读只写打开FIFO，调用read阻塞
//通信中写退出，read不阻塞，写恢复，read阻塞
//通信中读退出，写进程也退出
//缓冲区满时write阻塞
//open以可读可写打开FIFO，open不阻塞，read阻塞，缓冲区满时write阻塞
#include <sys/types.h>
#include <sys/ipc.h>    //ftok头文件
key_t ftok(const char *pathname, int proj_id);    //获取IPC键值，成功返回key，失败返回-1
#include <sys/msg.h>    //msgget头文件
int msgget(key_t,int msgflg);    //创建消息队列,成功返回消息队列标识符，失败返回-1
typedef struct
{
	long mtype;
	char mtext[100];
}MSG;    //消息格式
int msgsnd(int msgid,const void *msgp,size_t msgsz,int msgflg);    //添加消息到队列，成功返回0,失败返回-1
ssize_t msgrcv(int msgid,void *msgp,size_t msgsz,long msgtyp,int msgflg);    //接收消息，成功返回读取消息的长度，失败返回-1
int msgctl(int msgid,int cmd,struct msgid_ds *buf);    //控制消息队列属性，成功返回0,失败返回-1
                     IPC_RMID
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/shm.h>    //共享内存头文件
int shmget(key_t key,size_t size,int shmflg);    //创建或打开共享内存，成功返回共享内存标识符，失败返回-1
void *shmat(int shmid,const void *shmaddr,int shmflg);    //映射，成功返回映射地址，失败返回-1
                      NULL                0
int shmdt(const void *shmaddr);    //分离共享内存，成功返回0,失败返回-1
int shmctl(int shmid,int cmd,struct shmid_ds *buf);    //共享内存控制，成功返回0,失败返回-1
                     IPC_RMID    //删除
void *shmat(int shmid,const void *shmaddr,int shmflg);    //映射，成功返回映射地址，失败返回-1
#include <pthread.h>    //线程头文件，编译加参数 -lpthread
int pthread_create(pthread_t *thread,const thread_attr_t *attr,void *(*start_routine)(void *),void *arg);    //创建线程
                                     NULL
int pthread_join(pthread_t thread,void **retval);    //等子进程结束回收资源，成功返回0,失败返回非0,有阻塞
int pthread_detach(pthread_t thread);    //独立线程，终止时系统回收资源，成功返回0,失败返回非0
//不终止进程的前提下终止线程
//1 线程从执行函数中返回
//2 线程调用pthread_exit
//3 被其他线程取消
void pthread_exit(void *retval);    //退出线程
int pthread_cancel(pthread_t thread);    //发送取消线程信号，成功返回0,失败返回出错编号，无阻塞 
pthread_setcancelstate(int state,int *old_state);    //设置线程是否可被取消，默认是
                       PTHREAD_CANCEL_DISABLE    //不可取消
					   PTHREAD_CANCEL_ENABEL    //可以取消
//出现取消点的函数见posix*.bmp
void pthread_setcanceltype(int type,int *oldtype);    //立即终止线程
                           PTHREAD_CANCEL_ASYNCHRONOUS    //立即取消
						   PTHREAD_CANCEL_DEFERRED    //不立即取消
void pthread_cleanup_push(void (*routine)(void *),void *arg);    //注册线程清理函数
void pthread_cleanup_pop(int execute);    //删除清理函数，0==execute?不清理：清理
//调用清理函数
//1 调用pthread_exit退出线程
//2 相应其他线程取消要求
//3 非零execute调用pthread_cleanup_pop
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *arrt);    //初始化互斥锁，成功返回0,失败返回非0
                                              NULL    //默认属性
int pthread_mutex_lock(pthread_mutex_t *mutex);    //上锁，阻塞至解锁，成功返回0,失败返回非0
int pthread_mutex_trylock(pthread_mutex_t *mutex);    //上锁，否则立即返回，成功返回0,失败返回非0，非阻塞
int pthread_mutex_unlock(pthread_mutex_t *mutex);    //解锁，成功返回0,失败非0
int pthread_mutex_destroy(pthread_mutex_t *mutex);    //销毁锁，成功返回0,失败返回非0
#include <semaphore.h>    //信号量头文件
int sem_init(sem_t *sem,int pshared,unsigned int value);    //创建初始化信号量，成功返回0,失败返回-1
                        //pshared==0?线程：进程
                                    //信号初始值
int sem_wait(sem_t *sem);    //信号量值减1,小于0阻塞，成功返回0,失败返回-1
int sem_trywait(sem_t *sem);    //同上，不阻塞
int sem_post(sem_t *sem);    //信号值加1等待唤醒，阻塞，成功返回0,失败返回-1
int sem_getvalue(sem_t *sem,int *sval);    //sval保存sem标识，成功返回0,失败返回-1
int sem_destroy(sem_t *sem);    //删除信号量，成功返回0,失败返回-1
//进程间通信一般用有名信号量
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>    //有名信号量头文件
sem_t *sem_open(const char *name,int oflag,mode_t mode,unsigned int value);    //创建信号量，成功返回信号量地址，失败返回SEM_FAILED
int sem_close(sem_t *sem);    //关闭有名信号量，成功返回0,失败返回-1
int sem_unlink(const char *name);    //删除有名信号量文件，成功返回0,失败返回-1
